package aop
/**
 * 如果对象实现了GroovyInterceptable接口,调用对象上的任何方法
 * 都会走invokeMethod方法,可以很容易实现过AOP
 */
class Employee implements GroovyInterceptable {
    //过滤器,拦截类的任何方法
    def pre(){
        //不能使用println ,因为是groovy注入的会被拦截
        System.out.println "前置方法-----"
    }
    def login(args){ System.out.println "用户登录,用户名:$args.name" }
    @Override
    Object invokeMethod(String name, args) {
        //如果方法不是pre,就拦截执行pre过滤方法
        if(name !='pre'){
            Employee.metaClass.getMetaMethod("pre").invoke(this,null)
        }
        //再执行目标方法
        //必须传调用的对象,即this(employee)
        if(Employee.metaClass.respondsTo(this,name).size()==0){//方法不存在
            //Employee.metaClass.invokeMethod(this,name,args) //会抛出MissMethod异常
            System.out.println "类中没有此方法"
        }else{
            Employee.metaClass.getMetaMethod(name).invoke(this,args)
        }
    }
    static void main(String[] args) {
        def employee = new Employee()
        employee.login([name:"侯征"])
        employee.layout() //调用不存在方法
    }
}
